import ast
import logging

from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带组件带布局的节点图形项 import 带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.Dict)
class 字典节点模型(ast节点基础模型):
    """
    字典节点模型，用于表示Python中的字典数据结构
    包含键值对，每个键和值都可以是不同类型
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "字典节点", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 处理字典的键值对
        for 索引, (键, 值) in enumerate(zip(self._ast节点.keys, self._ast节点.values)):
            # 处理键
            键节点 = 节点模型匹配器(键, self.所属节点模型管理器)
            if 键节点:
                起始接口 = 键节点.添加接口到节点("数据流", "输出", 接口名称=f"键_{索引}", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"键_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

            # 处理值
            值节点 = 节点模型匹配器(值, self.所属节点模型管理器)
            if 值节点:
                起始接口 = 值节点.添加接口到节点("数据流", "输出", 接口名称=f"值_{索引}", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"值_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 添加字典输出接口
        self.添加接口到节点("数据流", "输出", 接口名称="字典值")

        # 初始化字典内容
        self.参数名 = "字典值："
        self.参数值 = self._解析_ast值(self._ast节点)
        self.参数值修改回调 = self.数据节点参数值修改

    def _解析_ast值(self, 节点):
        """解析AST节点为可读字符串"""
        return ast.unparse(节点)

    def _生成_ast值(self, 内容):
        """将字符串内容转换为AST节点"""
        try:
            表达式 = ast.parse(内容, mode="eval").body
            if isinstance(表达式, ast.Dict):
                return 表达式
            raise ValueError(f"输入的值 {内容} 不是有效的字典表达式")
        except Exception as e:
            raise ValueError(f"无法解析字典表达式: {内容}, 错误: {e}")

    def 数据节点参数值修改(self, 新参数):
        """处理字典值的修改"""
        节点 = self._生成_ast值(新参数)
        if isinstance(节点, ast.Dict):
            self._ast节点 = 节点
        else:
            raise ValueError(f"输入的值 {新参数} 不能解析为字典节点")


class 字典图形节点(带组件带布局的节点图形项):
    """
    字典的图形表示，显示键值对内容
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)